package com.itlong.cloud.property.dao;

import com.itlong.cloud.POJO.DTO.app.AppElevatorAuthDTO;
import com.itlong.cloud.POJO.DTO.property.PropertyHouseholdRoleGetPageDTO;
import com.itlong.cloud.POJO.PO.AppUserEntranceRolePO;
import com.itlong.cloud.POJO.PO.DeviceElevatorFloorConfigPO;
import com.itlong.cloud.POJO.PO.DeviceEntranceRolePO;
import com.itlong.cloud.POJO.VO.property.PropertyHouseHoldRoleElevatorGetPageVO;
import com.itlong.cloud.POJO.VO.property.PropertyHouseholdRoleEntranceGetPageVO;
import com.itlong.cloud.POJO.VO.property.PropertyHouseholdRoleGetPageVO;
import com.itlong.cloud.POJO.VO.property.PropertyUserProofAuthInfoGetVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *      物业系统住户权限(角色组)分配接口持久层接口
 * </desc>
 *
 * @createDate 2019/02/20
 */
@Mapper
@Repository
public interface IPropertyHouseholdRoleDao {

    /**
     * <desc>
     *      保存
     * </desc>
     *
     * @param map 格式化参数集
     * @return 保存的行数
     * @author wangzhi
     * @createDate 2019/02/20
     */
    Integer save(Map<String, Object> map);

    /**
     * <desc>
     *      分页获取住户角色组信息
     * </desc>
     *
     * @param params 查询参数
     * @return 分页结果
     * @author wangzhi
     * @createDate 2019/02/21
     */
    List<PropertyHouseholdRoleGetPageVO> getPage(Map<String, Object> params);

    /**
     * <desc>
     *      获取住户角色组信息总记录数
     * </desc>
     *
     * @param params 查询参数
     * @return 总记录数
     * @author wangzhi
     * @createDate 2019/02/21
     */
    Integer getRecordCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取单个住户角色组信息
     * </desc>
     *
     * @param params 查询参数
     * @return 单个住户角色组信息
     * @author wangzhi
     * @createDate 2019/02/21
     */
    PropertyHouseholdRoleGetPageVO getOne(Map<String, Object> params);

    /**
     * <desc>
     *      修改住户角色组信息
     * </desc>
     *
     * @param map 格式化参数集
     * @return 1-成功，0-失败
     * @author wangzhi
     * @createDate 2019/02/21
     */
    Integer update(Map<String, Object> map);

    /**
     * <desc>
     *      校验住户角色组信息是否有关联用户数据
     * </desc>
     *
     * @param roleId 角色id
     * @return 1-有，0-无
     * @author wangzhi
     * @createDate 2019/02/21
     */
    Integer getUserRoleCount(@Param("roleId") String roleId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      校验住户角色组信息是否有关联设备数据
     * </desc>
     *
     * @param roleId 角色id
     * @return 1-有，0-无
     * @author wangzhi
     * @createDate 2019/02/21
     */
    Integer getEntranceRoleCount(@Param("roleId") String roleId, @Param("projectId") String projectId);

    /**
     * <desc>
     *      删除住户角色组信息
     * </desc>
     *
     * @param propertyHouseholdRoleGetPageDTO 获取分页住户角色组信息DTO
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/02/21
     */
    Integer delete(PropertyHouseholdRoleGetPageDTO propertyHouseholdRoleGetPageDTO);

    /**
     * <desc>
     *      分页获取门禁设备列表信息
     * </desc>
     *
     * @param params 查询参数
     * @return 门禁设备列表信息
     * @author wangzhi
     * @createDate 2019/02/21
     */
    List<PropertyHouseholdRoleEntranceGetPageVO> getEntrancePage(Map<String, Object> params);

    /**
     * <desc>
     *      分页获取门禁设备列表信息总记录数
     * </desc>
     *
     * @param params 查询参数
     * @return 门禁设备列表信息总记录数
     * @author wangzhi
     * @createDate 2019/02/21
     */
    Integer getEntranceRecordCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取角色绑定的用户id列表
     * </desc>
     *
     * @param roleId 角色id
     * @return 用户id列表
     * @author wangzhi
     * @createDate 2019/02/21
     */
    List<String> getUserIdListByRoleId(@Param("roleId") String roleId);

    /**
     * <desc>
     *      获取角色绑定的用户id列表,有人脸的用户
     * </desc>
     *
     * @param roleId 角色id
     * @param projectId 项目id
     * @return 用户id列表
     * @author Qiang.S
     * @createDate 2020/03/16
     */
    List<String> getUserIdFaceListByRoleId(@Param("roleId") String roleId, @Param("projectId")String projectId);

    /**
     * <desc>
     *      获取角色绑定的设备序列号列表
     * </desc>
     *
     * @param roleIdList 角色id列表
     * @param type 1为查询启用状态 2为非删除状态
     * @return 用户id列表
     * @author wangzhi
     * @createDate 2019/02/22
     */
    List<String> getDeviceUniqueListByRoleId(@Param("roleIdList") List<String> roleIdList,@Param("type") String type);

    /**
     * <desc>
     *      获取用户在非指定分组的设备序列号列表
     * </desc>
     *
     * @param roleId 角色id
     * @param userId 用户id
     * @param projectId 项目id
     * @return 设备列表
     * @author Juguang.S
     * @createDate 2021/04/02
     */
    List<String> getEntranceListByNotInRoleIdAndUserId(@Param("roleId") String roleId,@Param("userId") String userId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取角色绑定的电梯设备序列号列表
     * </desc>
     *
     * @param roleIdList 角色id
     * @param type 1为查询启用状态 2为非删除状态
     * @return 用户id列表
     * @author Juguang.S
     * @createDate 2021/04/01
     */
    List<AppElevatorAuthDTO> getElevatorListByRoleId(@Param("roleIdList") List<String> roleIdList,@Param("type") String type);

    /**
     * <desc>
     *      获取用户非指定分组外的电梯设备序列号列表
     * </desc>
     *
     * @param roleId 角色id
     * @param projectId 项目id
     * @return 用户id列表
     * @author Juguang.S
     * @createDate 2021/04/02
     */
    List<AppElevatorAuthDTO> getElevatorListByNotInRoleIdAndUserId(@Param("roleId") String roleId,
                                                                   @Param("userId") String userId,
                                                                   @Param("projectId") String projectId);

    /**
     * <desc>
     *      删除角色权限组设备授权信息
     * </desc>
     *
     * @param roleId 角色id
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/02/22
     */
    Integer deleteDeviceAuth(@Param("roleId") String roleId,@Param("currentDeviceUniques") String[] currentDeviceUniques);

    /**
     * <desc>
     *      删除角色组电梯授权信息
     * </desc>
     *
     * @param groupId 角色组id
     * @return
     * @Author Zhu.yj
     * @createDate  2021/3/31
     */
    Integer deleteGroupElevatorAuth(@Param("groupId") String groupId);


    /**
     * <desc>
     *      删除角色权限组设备人员分配信息
     * </desc>
     *
     * @param roleId 角色id
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/02/22
     */
    Integer deleteUserAuth(@Param("roleId") String roleId);

    /**
     * <desc>
     *      批量保存设备授权信息
     * </desc>
     *
     * @param deviceEntranceRolePOList 保存数据集合
     * @return 1成功 0失败
     * @author wangzhi
     * @createDate 2019/02/22
     */
    Integer batchSaveDeviceAuth(List<DeviceEntranceRolePO> deviceEntranceRolePOList);

    /**
     * <desc>
     *      批量保存人员分配信息
     * </desc>
     *
     * @param appUserEntranceRolePOList 保存数据集合
     * @return 1成功 0失败
     * @author wangzhi
     * @createDate 2019/02/22
     */
    Integer batchSaveUserAuth(List<AppUserEntranceRolePO> appUserEntranceRolePOList);

    /**
     * <desc>
     *      拿到当前角色id所有普通门禁设备序列号字符串
     * </desc>
     *
     * @return 所有普通门禁设备序列号字符串
     * @author wangzhi
     * @createDate 2019/02/22
     */
    String getAllDeviceUniqueStr(@Param("projectId") String projectId);

    /**
     *<desc>
     *      根据项目编号查询所有的电梯设备
     *</desc>
     *
     * @return 所有的电梯设备序列号字符串
     * @author Juguang.S
     * @createDate 2021/04/01
     */
    String getAllElevatorDeviceUniqueStr(@Param("projectId") String projectId);

    /**
     *<desc>
     *      过滤有人脸的用户
     *</desc>
     *
     * @param userIds 用户id
     * @param projectId 项目id
     * @return
     * @author Qiang.S
     * @createDate 2020/03/16
     */
    List<String> getUserHaveFace(@Param("userIds") List<String> userIds, @Param("projectId") String projectId);

    /**
     * <desc>
     *      根据角色组id获取电梯权限
     * </desc>
     *
     * @param groupId 角色组id
     * @return
     * @Author Zhu.yj
     * @createDate  2021/3/29
     */
    Map<String, Object> getElevatorAuthByGroupId(@Param("groupId") String groupId);

    /**
     * <desc>
     *      根据角色组id获取电梯权限
     * </desc>
     *
     * @param groupId 角色组id
     * @return
     * @Author Zhu.yj
     * @createDate  2021/3/29
     */
    List<Map<String, Object>> getElevatorAuthByGroupIds(@Param("groupId") String groupId);

    /**
     * <desc>
     *      获取所有电梯分页列表
     * </desc>
     *
     * @param params 查询参数map
     * @return 电梯列表，详情见VO
     * @Author Zhu.yj
     * @createDate  2021/3/30
     */
    List<PropertyHouseHoldRoleElevatorGetPageVO> getElevatorPage(Map<String, Object> params);


    /**
     * <desc>
     *      获取电梯分页列表数量
     * </desc>
     *
     * @param params 查询参数map
     * @return 列表总数量
     * @Author Zhu.yj
     * @createDate  2021/3/31
     */
    Integer getElevatorPageCount(Map<String, Object> params);

    /**
     * <desc>
     *      根据条件查询用于展示的电梯楼层信息
     *      （注：若由楼层服务范围，则按服务范围查询。先查询logicFloor,没有则查询floorNum,再没有，则查询naturalFloor）
     * <desc/>
     * @param  param    查询条件
     * @return  用于展示的楼层信息，多条用英文，风格 如 -2，-1，1，***
     * @author Biao.R
     * @createDate 2017/12/29
     */
    List<DeviceElevatorFloorConfigPO> getShowFloor(Map<String, Object> param);

    /**
     * <desc>
     *  获取电梯地址
     * </desc>
     *
     * @param deviceUnique 设备唯一码
     * @return 电梯地址拼接字符串
     * @Author Zhu.yj
     * @createDate  2021/3/31
     */
    String getElevatorAddress(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      获取所有角色组与电梯权限
     * </desc>
     *
     * @param projectId 项目id
     * @return 角色组名称与角色组对应的电梯权限
     * @Author Zhu.yj
     * @createDate  2021/4/1
     */
    List<Map<String, String>> getGroupDevice(@Param("projectId") String projectId);

    /**
     * <desc>
     *      根据查询参数获取用户角色组列表
     * </desc>
     *
     * @param params 查询参数
     * @return 用户角色组列表
     * @Author Zhu.yj
     * @createDate  2021/4/9
     */
    List<String> getUserGroupCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取用户有关人脸和身份证相关信息
     * </desc>
     *
     * @param userId 用户id
     * @param projectId 项目id
     * @return
     * @Author Juguang.S
     * @createDate  2021/4/20
     */
    PropertyUserProofAuthInfoGetVO getUserFaceAndIdCardInfo(@Param("userId") String userId, @Param("projectId") String projectId);
    /**
     * <desc>
     *      删除用户的角色组权限
     * </desc>
     *
     * @param params 删除条件
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/19
     */
    Integer deleteUserGroup(Map<String, Object> params);

    /**
     * <desc>
     *      获取用已有的角色组列表
     * </desc>
     *
     * @param
     * @return
     * @Author Zhu.yj
     * @createDate  2021/4/19
     */
    List<Map<String, String>> getUserRoleList(Map<String, Object> params);

    /**
     * <desc>
     *      根据角色名称查询角色id
     * </desc>
     *
     * @param params 角色名称，项目id
     * @return
     * @Author Zhu.yj
     * @createDate  2021/5/8
     */
    String getRoleIdByRoleName(Map<String, Object> params);

    /**
     * <desc>
     *      获取指定电梯所绑定群控器下的所有电梯
     * </desc>
     *
     * @param deviceUnique 电梯唯一编码
     * @return 电梯机号
     * @Author Juguang.S
     * @createDate  2021/5/10
     */
    List<String> getCloudControllerElevatorInfo(String deviceUnique);

    /**
     * <desc>
     *      校验住户角色组信息是否有关联电梯设备数据
     * </desc>
     *
     * @param roleId 角色id
     * @return 1-有，0-无
     * @author Juguang.S
     * @createDate 2021/05/10
     */
    Integer getElevatorRoleCount(@Param("roleId") String roleId, @Param("projectId") String projectId);


    /**
     * <desc>
     *      获取绑定同一群控器的电梯
     * </desc>
     *
     * @param params 查询参数
     * @return
     * @Author Zhu.yj
     * @createDate  2021/5/17
     */
    List<String> getDeviceUniqueIdList(Map<String, Object> params);
}
